/**
 * 运动API模块
 * 用于运动记录的CRUD、统计和类型相关操作
 */

const request = require('./request');

/**
 * 获取运动类型列表
 * @returns {Promise<Array>} 运动类型列表
 */
async function getExerciseTypes() {
  return request.get('/exercises/types');
}

/**
 * 获取用户的运动记录列表
 * @param {Object} params 查询参数
 * @param {string} params.startDate 开始日期，可选
 * @param {string} params.endDate 结束日期，可选
 * @param {string} params.type 运动类型，可选
 * @returns {Promise<Object>} 运动记录列表及统计信息
 */
async function getExercises(params = {}) {
  return request.get('/exercises', params);
}

/**
 * 获取单个运动记录详情
 * @param {string} id 运动记录ID
 * @returns {Promise<Object>} 运动记录详情
 */
async function getExerciseById(id) {
  return request.get(`/exercises/${id}`);
}

/**
 * 创建新的运动记录
 * @param {Object} exerciseData 运动记录数据
 * @param {string} exerciseData.type 运动类型
 * @param {string} [exerciseData.category] 运动类别，可选
 * @param {string} exerciseData.date 日期
 * @param {string} exerciseData.startTime 开始时间
 * @param {number} exerciseData.duration 持续时间(分钟)
 * @param {number} exerciseData.intensity 强度(1-10)
 * @param {number} exerciseData.caloriesBurned 消耗卡路里
 * @param {number} [exerciseData.glucoseBefore] 运动前血糖值，可选
 * @param {number} [exerciseData.glucoseAfter] 运动后血糖值，可选
 * @param {string} [exerciseData.notes] 备注，可选
 * @returns {Promise<Object>} 创建的运动记录
 */
async function createExercise(exerciseData) {
  // 确保包含运动类别信息
  if (!exerciseData.category && exerciseData.type) {
    // 根据运动类型推断类别
    exerciseData.category = inferExerciseCategory(exerciseData.type);
  }
  
  return request.post('/exercises', exerciseData);
}

/**
 * 推断运动类别
 * @param {string} type 运动类型
 * @returns {string} 运动类别
 */
function inferExerciseCategory(type) {
  // 有氧运动类型
  const aerobicTypes = [
    '步行', '快走', '慢跑', '跑步', '骑行', '骑自行车', '游泳', 
    '跳舞', '广场舞', '椭圆机', '爬楼梯', '跳绳', '球类运动', '太极拳', '划船机'
  ];
  
  // 抗阻训练类型
  const resistanceTypes = [
    '健身', '哑铃训练', '杠铃训练', '器械训练', '弹力带', '俯卧撑', 
    '深蹲', '仰卧起坐', '引体向上', '卧推', '壶铃', '爆发力训练'
  ];
  
  // 柔韧与平衡类型
  const flexibilityTypes = [
    '瑜伽', '八段锦', '拉伸', '静态伸展', '动态伸展', '平衡训练', 
    '关节活动度训练', '舒展运动'
  ];
  
  if (aerobicTypes.includes(type)) return '有氧运动';
  if (resistanceTypes.includes(type)) return '抗阻训练';
  if (flexibilityTypes.includes(type)) return '柔韧与平衡';
  return '有氧运动'; // 默认归类为有氧运动
}

/**
 * 更新运动记录
 * @param {string} id 运动记录ID
 * @param {Object} exerciseData 要更新的运动记录数据
 * @returns {Promise<Object>} 更新后的运动记录
 */
async function updateExercise(id, exerciseData) {
  return request.put(`/exercises/${id}`, exerciseData);
}

/**
 * 删除运动记录
 * @param {string} id 运动记录ID
 * @returns {Promise<Object>} 删除结果
 */
async function deleteExercise(id) {
  return request.delete(`/exercises/${id}`);
}

/**
 * 获取每周运动统计
 * @returns {Promise<Object>} 每周运动统计数据
 */
async function getWeeklyStats() {
  return request.get('/exercises/stats/weekly');
}

/**
 * 计算卡路里消耗
 * @param {string} exerciseType 运动类型
 * @param {number} duration 运动时长(分钟)
 * @param {number} intensity 运动强度(1-10)
 * @param {number} weight 体重(kg)
 * @param {Object} userProfile 用户资料(可选，包含年龄、性别等信息)
 * @returns {number} 消耗的卡路里数
 */
const calculateCalories = (exerciseType, duration, intensity, weight, userProfile = null) => {
  // 默认值
  weight = weight || 65; // 默认体重65kg
  const defaultMET = 4.0; // 默认MET值(中等强度活动)
  
  // 获取基础MET值
  let baseMET = getMETforExercise(exerciseType);
  
  // 1. 强度调整：根据用户选择的强度(1-10)调整MET值
  // 1-3: 低强度(-20%)，4-7: 中等强度(+0%)，8-10: 高强度(+20%)
  let intensityFactor = 1.0;
  if (intensity <= 3) {
    intensityFactor = 0.8;  // 降低20%
  } else if (intensity >= 8) {
    intensityFactor = 1.2;  // 提高20%
  }
  
  // 应用强度因子
  let adjustedMET = baseMET * intensityFactor;
  
  // 2. 个人因素调整
  let personalFactor = 1.0;
  
  if (userProfile) {
    // 年龄调整：年龄越大，效率越低
    const age = userProfile.age || 40;
    if (age > 40) {
      personalFactor -= Math.min(0.2, (age - 40) * 0.005); // 每增加10岁降低5%，最多降低20%
    }
    
    // 性别调整：男性基础代谢率略高
    if (userProfile.gender === 'female') {
      personalFactor -= 0.1; // 女性降低10%
    }
    
    // 体重指数(BMI)调整
    if (userProfile.height) {
      const heightInMeters = userProfile.height / 100;
      const bmi = weight / (heightInMeters * heightInMeters);
      
      if (bmi > 25) {
        personalFactor -= Math.min(0.15, (bmi - 25) * 0.01); // BMI高于25，效率降低，最多降低15%
      }
    }
    
    // 训练状态调整：经常锻炼的人效率更高
    if (userProfile.exerciseFrequency === 'regular') {
      personalFactor += 0.1; // 经常锻炼提高10%
    }
  }
  
  // 应用个人因子
  adjustedMET *= personalFactor;
  
  // 3. 使用修正后的MET值计算卡路里消耗
  // 公式: 卡路里 = MET值 × 体重(kg) × 运动时间(小时)
  // 1 MET = 1 kcal/kg/hour
  const durationInHours = duration / 60;
  const calories = adjustedMET * weight * durationInHours;
  
  // 四舍五入到整数
  return Math.round(calories);
};

/**
 * 获取特定运动类型的MET值
 * 基于《2024糖尿病运动治疗指南》和美国运动医学会(ACSM)的数据
 * @param {string} exerciseType 运动类型
 * @returns {number} MET值
 */
const getMETforExercise = (exerciseType) => {
  // MET值参考：https://sites.google.com/site/compendiumofphysicalactivities/
  const metValues = {
    // 有氧运动
    '步行': 3.5,
    '快走': 4.3,
    '慢跑': 7.0,
    '跑步': 8.3,
    '骑自行车': 6.8,
    '游泳': 6.0,
    '椭圆机': 5.0,
    '划船机': 6.0,
    '登山': 6.0,
    '爬楼梯': 7.0,
    '跳绳': 10.0,
    '健走': 4.5,
    '踏步机': 5.5,
    '动感单车': 7.0,
    '高强度间歇训练': 8.5,
    '有氧操': 6.5,
    '太极拳': 3.0,
    '舞蹈': 5.0,
    '广场舞': 4.5,
    '交谊舞': 4.5,
    
    // 抗阻训练
    '健身': 5.0,
    '哑铃训练': 3.5,
    '杠铃训练': 6.0,
    '器械训练': 4.5,
    '弹力带': 3.5,
    '俯卧撑': 4.0,
    '深蹲': 5.0,
    '仰卧起坐': 3.8,
    '引体向上': 6.0,
    '卧推': 3.5,
    '壶铃': 6.0,
    '爆发力训练': 7.0,
    
    // 柔韧与平衡
    '瑜伽': 3.0,
    '八段锦': 2.5,
    '拉伸': 2.3,
    '静态伸展': 2.0,
    '动态伸展': 2.5,
    '平衡训练': 2.5,
    '关节活动度训练': 2.0,
    '舒展运动': 2.3,
    
    // 球类运动
    '篮球': 6.5,
    '足球': 7.0,
    '网球': 7.3,
    '乒乓球': 4.0,
    '羽毛球': 5.5,
    '高尔夫球': 3.5,
    
    // 默认
    '其他': 4.0
  };
  
  return metValues[exerciseType] || 4.0; // 如果未找到，返回默认值4.0
};

module.exports = {
  getExerciseTypes,
  getExercises,
  getExerciseById,
  createExercise,
  updateExercise,
  deleteExercise,
  getWeeklyStats,
  calculateCalories,
  inferExerciseCategory
}; 